package cn.bugstack.gateway.session;

import io.netty.channel.Channel;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler;
import org.apache.zookeeper.server.SessionTracker;

/**
 * BaseHandler 抽象基类
 *
 * 该类继承自 Netty 的 {@link SimpleChannelInboundHandler}，用于定义通用的消息处理逻辑模板。
 * 主要功能是接收特定类型的消息（由泛型参数 T 指定），
 * 并将消息的处理逻辑抽象为 {@link #session(ChannelHandlerContext, Channel, Object)} 方法，
 * 由具体的子类去实现。
 *
 * 设计目的：
 * - 提供一个统一的消息接收和分发入口；
 * - 屏蔽底层 channelRead0 的重复逻辑；
 * - 子类只需关注自身业务逻辑，不必关心消息读取和上下文传递的细节。
 *
 * @param <T> 指定要处理的消息类型，例如：FullHttpRequest、TextWebSocketFrame 等
 *
 * 作者：陈佳
 * 日期：2025-10-26
 */
public abstract class BaseHandler<T> extends SimpleChannelInboundHandler<T> {

    /**
     * channelRead0 方法是 Netty 在接收到指定类型消息时自动调用的回调函数。
     *
     * 在这里，我们将收到的消息统一交由抽象方法 {@link #session(ChannelHandlerContext, Channel, Object)}
     * 进行处理，从而让子类专注于业务逻辑层面的实现。
     *
     * @param ctx 当前通道的上下文对象（用于操作管道、发送消息、关闭连接等）
     * @param msg 收到的消息对象，类型由泛型参数 T 决定
     * @throws Exception 处理消息过程中可能抛出的异常
     */
    @Override
    protected void channelRead0(ChannelHandlerContext ctx, T msg) throws Exception {
        // 将消息分发到自定义的 session 方法进行业务处理
        session(ctx, ctx.channel(), msg);
    }

    /**
     * 抽象方法：业务消息处理逻辑。
     *
     * 子类需要实现此方法，以定义接收到消息后的具体处理方式。
     *
     * @param ctx     当前通道的上下文对象
     * @param channel 当前通道（Channel）对象，可用于发送响应或关闭连接
     * @param request 接收到的请求消息
     */
    protected abstract void session(ChannelHandlerContext ctx, final Channel channel, T request);
}

